/*
 FilmAffinity++

 Version 2.0.21
 18 de marzo de 2009
 Basado en FilmAffinityPlus por Javier Arias http://javierarias.wordpress.com/scripts/filmaffinityplus/
 Released under the GPL license
 http://www.gnu.org/copyleft/gpl.html

 Website: http://www.buxo.org/filmaffinity/

 @todo:
 - Banderas de los paises participantes (¿Desde IMDB?) multifolio
 - detectar Opera
 - Leyenda en almas gemelas
 - Opción de ocultar menus originales
 - Aplicar limites a todas las paginas de listados
 - Nota media en listas
 - Nota media en busquedas por director
 - Cambios en la lista de TOP

 Changelog
 * 2.0.22, 18 de Marzo
 * Añadidos codigos para Lituania, Eslovaquia , Sri Lanka,
 Albania,Azerbaijan,Bangladesh,Benín,Emiratos Árabes,Etiopía,Guinea,Guinea Bissau,
 Haití,Jamaica,Jordania,Kenia,Kirguizstán,Laos,Letonia,Malta,
 Mauritania,Moldavia,Namibia,Tanzania,Trinidad y Tobago y Ucrania
 Andorra,Antigua y Barbuda,Arabia Saudí,Bahamas,Bahrein,Barbados,Belize,
 Botswana,Brunei,Burundi,Cabo Verde,Camerún,Chipre,Comores,Congo,Dominica,
 El Salvador,Eritrea,Fidji,Gabón,Gambia,Ghana,Granada,Guinea Ecuatorial,
 Guyana,Honduras,Kuwait,Lesotho,Liberia,Libia,Liechtenstein,Madagascar,
 Malawi,Maldivas,Marshall (Islas),Mauricio (Isla),Micronesia,Mónaco,Montenegro,
 Mozambique,Myanmar - Birmania,Níger,Omán,Palau,Papuasia Nueva Guinea,Qatar,
 Rep. Centroafricana,Ruanda,Samoa,San Marino,Santo Tomé y Príncipe,
 Seychelles,Sierra Leona,Siria,Somalia,Sudán,Surinam,Swazilandia,
 Tajikistan,Togo,Turkmenistán,Uganda,Uzbekistan,Vanuatú,Zambia,Zimbabwe
 * Banderas en la lista de amigos

 * 2.0.21, 18 de Marzo de 2009
 + Añadidos/modificados codigos para RDA, RFA, URSS, Líbano y Serbia y Montenegro
 - Eliminado opción para Ocultar series de TV (por ahora da problemas)
 # Cambiadas las imagenes de Almas gemelas(problemas al copiar/pegar en foros)


 * 2.0.20
 + Banderas de los paises coproductores en la ficha de la pelicula (Sacado de la lista de Productora)
 + Muestra los cambios en el nº de criticas de los amigos


 * 2.0.19, 17 de Marzo de 2009
 # Corregido bug con icono de zoom de los posters al centrar
 # Modifica la etiqueta de cantidad de listas a las que pertenece la pelicula al añadir o borrar
 # Corregido bug en opción de centrado (no se mostraba en panel de configuración)
 # Corregido bug en enlaces externos con tilde (no se podian ocultar)
 # Corregido bug en enlaces externos en el panel derecho (se mostraban las categorias sin enlaces activos)

 * 2.0.18, 16 de Marzo de 2009
 + Añadido ordenación dentro de las listas
 # Corregido Bug en estadisticas de usuarios
 # Corregido Bug en puntuaciones. (en pagina de película, con una sola alma gemela)
 + Añadido ocultar Series de TV (preliminar)
 # Centrar pagina en ventana del navegador (mejor hacerlo via stylish)
 + Añadido opción para plegar menus

 * 2.0.17, 13 de Marzo de 2009
 # Corregido bug en página de amigos

 * 2.0.16, 12 de Marzo de 2009
 # Corregido bug al mostrar enlaces en la página de busqueda

 * 2.0.15, 12 de Marzo de 2009
 + Añadido comprobación de listas en el menu rapido de listas

 * 2.0.14, 11 de Marzo de 2009
 # Sustituidas las funciones de comprobación de sección.
 + Añadido QuickList a las paginas de busqueda y Top
 # Modificado el estilo del menu de listas rapidas.  

 * 2.0.12
 # Modificado DaleYa para que busque por el titulo original

 * 2.0.11
 + Añadido enlace a ForiegMMoviesDDL (petición de capacitivo)
 + Añadido enlace a DaleYa (petición de capacitivo)
 + Añadido soporte para opciones en los enlaces (DaleYa)

 * 2.0.9, 10 de Marzo de 2009
 - Eliminada la dependencia del indice de tabla en insertar enlaces en titulo

 * 2.0.8, 10 de Marzo de 2009
 +Añadido rapido a listas desde la ficha de la pélicula

 * 2.0.7b, 10 de Marzo de 2009
 # Modificado Icono vagos.es
 # Corregido el error en listas rapidas

 * 2.0.7, 10 de Marzo de 2009
 Historico en almas gemelas.

 * 2.0.6, 7 de Marzo de 2009
 Añadida lista rapida a pagina de votaciones de usuarios

 * 2.0.5, 5 de Marzo de 2009
 Corregida pantalla selección de listas para nº grande de listas

 * 2.0.4, 4 de marzo de 2009 (publica)
 Añadidos almas gemelas caidas y fecha de ultimos cambios.
 Ocultar enlaces por tipo
 Modificado el codigo para guardar las preferencias
 Posibilidad de modificar el nº de peliculas que aparecen en las listas de recomendaciones y TOP

 * 2.0.3, 3 de marzo de 2009 (interna)
 Añadido el control de cambios en almas gemelas
 Añadidas opciones para activar/desactivar los nuevos cambios

 * 2.0.2, 2 de marzo de 2009 (interna)
 Añadido el sistema rapido para añadir a listas

 * 2.0.1, 1 de marzo de 2009 (interna)
 Integrados los menus en la barra izquierda
 Integrados enlaces en la ficha de la pelicula

 * 1.2.0 -> FilmAffinityPlus por Javier Arias

 * 1.2.0, 26 de agosto de 2008
 Añadida la opción para abrir los enlaces en nueva ventana (muy solicitado).
 Ahora se utiliza la versión en castellano de IMDb.
 Cambio de imagen del panel de configuración.
 Añadido el sitio de información general Rotten Tomatoes (petición de Jerry Lucas).
 Añadidos los siguientes sitios de descargas: aRGENTeaM, titles.box.sk y fileheaven (petición de aixa-impaciente).
 Añadido el sitio de descarga directa Taringa!.
 Arreglada la búsqueda en CINeol.
 Se indica cuáles de los sitios web a los que enlaza el script requieren registro.
 En el log se muestra la versión del script, útil para buscar y corregir errores.
 Se puede acceder fácilmente a la información de depurado pulsando en el título de la barra de FilmAffinityPlus.

 * 1.1.0, 27 de junio de 2008
 Añadida una barra en la parte superior izquierda de la pantalla, con botones para acceder al panel de configuración, a la web oficial y para añadir FilmAffinity a los motores de búsqueda de Firefox.
 Añadida una opción para cambiar el estilo de las estrellas de puntuación. Se incluyen dos esquemas: uno de estrellas rojas y otro de estrellas amarillas, además de la posibilidad de dejar las estrellas que vienen por defecto.
 Los enlaces a otros sitios web se muestran también en la página de resultados de una búsqueda.
 Tras realizar una búsqueda se guarda la opción de búsqueda realizada (ej: una búsqueda por "Reparto" deja seleccionada la opción "Reparto", actualmente tras cualquier tipo de búsqueda la opción seleccionada es siempre "Todas"). Además, tras la búsqueda el cuadro de búsqueda se queda con el foco del teclado.
 Arreglada la búsqueda en otros sitios web cuando los títulos contenían caracteres "raros", como tildes o acentos circunflejos (gracias aka_IDIOT).
 Se cambia el enlace a la versión inglesa de FilmAffinity para que apunte a la misma página en inglés, actualmente apunta siempre a la página principal (ej: desde la ficha de una película se va a la versión inglesa de la ficha).
 Cambiado el antiguo webchat por su nueva versión en flash.
 Recuperado el sitio de subtítulos solosubtitulos.com pues parece que vuelve a funcionar.
 Añadido un enlace externo a "el grupo de last.fm que surgió del foro que surgió de FilmAffinity" (sugerencia de VicenteJavier).
 Se muestra la bandera de cada país en la sección "Mis datos", también en la búsqueda avanzada y en los TOP FilmAffinity.
 En la sección "Mis datos" se añade a las estadísticas el número de países diferentes con películas vistas.
 Las búsquedas para AllZine (gracias VicenteJavier) y para Cinépatas (gracias pohc) se realizan con el título traducido debido a que la tasa de aciertos es mucho mayor que con el título original.
 Añadido el sitio de descargas Vagos.es (petición de Soisa y de un usuario anónimo).
 Correcciones menores.

 * 1.0.1, 14 de mayo de 2008
 Cambiado ligeramente el CSS del panel de configuración.
 Correcciones menores.

 * 1.0.0, 12 de mayo de 2008
 Primera versión pública.
 Eliminada la búsqueda de subtítulos en solosubtitulos.com pues la página ha desaparecido.

 * 0.9.9, 25 de abril de 2008
 Arreglada la búsqueda en La Butaca.

 * 0.9.8, 23 de abril de 2008
 Para los enlaces a otros sitios web se utiliza el título original, no el traducido.
 Arreglada de nuevo la búsqueda en Google (gracias jota724).
 La notificación de cambios en el número de votos de Mis amigos también funciona para usuarios validadores de críticas, tal vez funcione para el resto de administradores (gracias jota724).

 * 0.9.7, 21 de abril de 2008
 Ahora el script funciona también para usuarios validadores de críticas, tal vez funcione para el resto de administradores (gracias jota724).
 Si no hay seleccionado ningún enlace de alguna categoría no se muestra ésta en la ficha de la película (gracias Zopilote).
 Arreglada la búsqueda en Alpacine (gracias Manhoman).
 Añadido DivX Clásico (petición de Grandine).

 * 0.9.6, 20 de abril de 2008
 'Secciones externas' aparecía incorrectamente en las páginas de estadísticas (gracias aka_IDIOT).
 Arreglada la búsqueda en Google (gracias aka_IDIOT).
 Arreglado pequeño fallo al cargar las preferencias cuando el tipo de dato era 'undefined'.
 Añadido Cine-Clásico (petición de Grandine).
 Añadido Cinépatas (petición de Zopilote).
 Añadido AllZine (petición de Grandine).

 * 0.9.5, 18 de abril de 2008
 Primera versión beta pública.

 */
// ==UserScript==
// @name           FilmAffinity++
// @namespace      http://www.filmaffinity.com/
// @description    Mejoras en FilmAffinity
// @include        http://www.filmaffinity.com/es/*
// @version 2.0.21
// ==/UserScript==

window.addEventListener("load", function () {
    doFAPP();
}, false);

function doFAPP() {
    var d = document;
    var appName = "FilmAffinity++";
    var appVersion = '2.0.21';
    var homepage = 'http://www.buxo.org/filmaffinity/';
    var url = d.location.href;
    var isAdmin = d.body.innerHTML.search(/\/es\/adm\/reviews_val\.php/ig) > -1;
    var methodEncode = function(txt) {
        return encodeURIComponent(txt);
    };
    var methodEscape = function(txt) {
        return escape(txt.replace(/\s/g, '+'));
    };

    var _TFILM = 1;
    var _TGEN = 2;
    var _TDOWN = 3;
    var _TSUB = 4;
    var ANCHOR_AFTER = 1;
    var ANCHOR_BEFORE = 2;
    var NUM_SM = 20 + 1;
    var debuglog = '<u><strong>INFORMACIÓN DE DEPURADO</strong></u>';

    var XPATH_SML = '//table[@class="list2"]';

    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, '');
    };

    String.prototype.clearTitle = function()
    {
        return (this.indexOf('(') > 1) ? this.substr(0, this.indexOf('(')).trim() : this.trim();
    };

    String.prototype.reverse = function() {
        return this.split("").reverse().join("");
    };

    String.prototype.findNode = function(context)
    {
        if (typeof context == "undefined") context = d;
        return findNode(context, this);
    };

    String.prototype.findNodes = function(context)
    {
        if (typeof context == "undefined") context = d;
        return findNodes(context, this);
    };

    String.prototype.findNodesArray = function(context)
    {
        if (typeof context == "undefined") context = d;
        return findNodesArray(context, this);
    };


    //http://www.iconarchive.com/category/funny/kidcons-icons-by-iconfactory.html
    var ratingStyles = {
        red: { name: 'Estrellas rojas', code: 'red', iconOn: '',
            iconOff: '',
            iconHalf: '' },
        yellow: { name: 'Estrellas amarillas', code: 'yellow', iconOn: '%3D',
            iconOff: '',
            iconHalf: '' }
    };

    var img_plus = "http://www.buxo.org/content/fapp/icons/plus.gif";
    var img_minus = "http://www.buxo.org/content/fapp/icons/minus.gif";
    var closeimg = "http://www.buxo.org/content/fapp/icons/close.png";
    var upimg = "http://www.buxo.org/content/fapp/icons/up.png";
    var downimg = "http://www.buxo.org/content/fapp/icons/down.png";
    var newimg = "http://www.buxo.org/content/fapp/icons/new.png";

    var ratings = {
        1: "Muy mala",
        2: "Mala",
        3: "Floja",
        4: "Regular",
        5: "Pasable",
        6: "Interesante",
        7: "Buena",
        8: "Notable",
        9: "Muy buena",
        10: "Excelente"
    };

    var menus = {
        0: {name:'SECCIONES EXTERNAS',anchor:'SECCIONES',position:ANCHOR_AFTER,cond:'SHOWSEMENU',
            options: {0:{title: 'El Foro que surgi&oacute; de FilmAffinity',
                href:'http://filmaffinity.mforos.com',
                target:'_blank'},
                1:{title: 'Chat NO OFICIAL en iRC-Hispano',
                    href:'http://www.irc-hispano.es/webchat/flash.php?canal=filmaffinity',
                    target:'_blank'},
                2:{title: 'El grupo de last.fm que surgi&oacute; del foro que surgi&oacute; de FilmAffinity',
                    href:'http://www.lastfm.es/group/El+grupo+que+surgi%C3%B3+del+foro+que+surgi%C3%B3+de+Filmaffinity',
                    target:'_blank'}
            }
        },
        1: {name:'FilmAffinity++',anchor:'USUARIOS',position:ANCHOR_BEFORE,cond:'SHOWSCRIPTMENU',
            options: {0: {title:'Panel de Configuraci&oacute;n',href:'#',target:'',onclick:preferences},
                1: {title:'Web Oficial FA++',href:'#',target:'',onclick:goToHomepage},
                2: {title:'A&ntilde;adir motor busqueda',href:'#',target:'',onclick:installSearchEngine},
                3: {title:'Informaci&oacute;n de depurado',href:'#',target:'',onclick:showLog}
            }
        }};

    var preferencesOptions = {
        0:{name:'SHOWQUICKLIST',text:'Mostrar icono para añadir rapidamente a listas.',def:true},
        1:{name:'FETCHFILMLISTS',text:'Mostrar las listas a las que pertenece la pelicula en el menú de listas rapidas.',def:false},
        2:{name:'SHOWSMCHANGES',text:'Mostrar cambios en las almas gemelas.',def:true},
        3:{name:'SHOWSMFALLEN',text:'Mostrar las almas gemelas caidas de la lista.',def:true},
        4:{name:'KEEPSMCHANGES',text:'Mantener los cambios en las almas gemelas mientras no se produzcan nuevos cambios.',def:true},
        5:{name:'SHOWSEMENU',text:'Mostrar el men&uacute; Secciones Externas en la barra de la izquierda.',def:true},
        6:{name:'SHOWSCRIPTMENU',text:'Mostrar el men&uacute; FilmAffinity++ en la barra de la izquierda.',def:true},
        // 7:{name:'OMITTVSHOWS',text:'Ocultar series de TV (experimental)',def:false},
        8:{name:'CENTERPAGE',text:'Centrar pagina en la ventana del navegador',def:false},
        9:{name:'FOLDMENUS',text:'Permitir plegar los menús',def:false},
        10:{name:'CHANGELIMIT',text:'Cambiar el n&deg; de peliculas a mostrar en Recomendaciones y TOP',def:false}
    };


    var sections = {
        MyFriends:'/myfriends\\.php/ig',
        Stats:'/userrep\\.php\\?user_id\\=/ig',
        UserRatting:'/userratings\\.php\\?user_id\\=/ig',
        Film:'/\\/film/ig',
        Search:'/\\/search\\.php/ig',
        MyData:'/\\/mydata\\.php/ig',
        TopGen:'/\\/topgen\\.php/ig',
        AdvSearch:'/\\/advsearch\\.php/ig',
        SoulMates: '/\\/soulmates\\.php/ig',
        MyLists:'/\\/mylists\\.php/ig',
        MyList:'/\\/mylist\\.php/ig',
        Tour:'/\\/tour\\.php/ig',
        SoulMatesRec:'/\\/smsrec\\.php/ig',
        UserRec: '/\\/userrec\\.php/ig',
        MyVotes: '/\\/myvotes\\.php/ig',
        AutoTour:'/\\/autotour\\.php/ig',
        EditMovieList: '/\\edtmovielists\\.php/ig',
        UptMyData: '/\\updmydata\\.php/ig'
    };

    var linkSitesTypes = {
        1:{caption:'Ficha en: ',preference:'verCine'},
        2:{caption:'Buscar en: ',preference:'verGeneral'},
        3:{caption:'Descagar de: ',preference:'verDescargas'},
        4:{caption:'Subtitulos en: ',preference:'verSubtitulos'}
    };

    var linkSites = {
        imdb : { name: 'IMDb',
            icon: 'http://imdb.com/favicon.ico',
            search: 'http://spanish.imdb.com/find?q=%searchvo;tt=on;nm=on;mx=20',
            method: methodEncode,
            type: _TFILM
        },
        cineol : { name: 'CINeol',
            icon: 'http://www.cineol.net/favicon.ico',
            search: 'http://www.cineol.net/multisearch.php?fan=1&where=movies&search=%searchvo',
            method: methodEscape,
            type: _TFILM
        },
        cinepatas : { name: 'Cinépatas',
            icon: 'http://www.cinepatas.com/favicon.ico',
            search: 'http://www.cinepatas.com/forum/searcher.php?search_keywords=%searchtr&easy_search=titles',
            method: methodEscape,
            type: _TFILM
        },
        rotten : { name: 'Rotten Tomatoes',
            icon: 'http://www.rottentomatoes.com/favicon.ico',
            search: 'http://www.rottentomatoes.com/search/full_search.php?search=%searchvo',
            method: methodEscape,
            type: _TFILM
        },
        alpacine : { name: 'Alpacine',
            icon: 'http://www.alpacine.com/favicon.ico',
            search: 'http://www.alpacine.com/buscar/?buscar=%searchvo',
            method: methodEscape,
            type: _TFILM
        },
        labutaca : { name: 'La Butaca',
            icon: 'http://www.labutaca.net/favicon.ico',
            search: 'http://www.google.com/custom?q=%searchvo&sa=Buscar+en&sitesearch=www.labutaca.net&q=&domains=www.labutaca.net',
            method: methodEncode,
            type: _TFILM
        },
        /*	dvdreviews : { name: 'DVD-reviews',
         icon: 'http://www.dvd-reviews.net/favicon.ico',
         search: 'http://www.google.com/custom?q=%searchvo&sitesearch=dvd-reviews.net',
         type: _TFILM
         },*/
        yahoo : { name: 'Yahoo! Movies',
            icon: 'http://movies.yahoo.com/favicon.ico',
            search: 'http://movies.yahoo.com/mv/search?p=%searchvo&x=0&y=0&fr=ush-movies&toggle=1&cop=&ei=UTF-8',
            method: methodEncode,
            type: _TFILM
        },

        wikipedia : { name: 'Wikipedia',
            icon: 'http://en.wikipedia.org/favicon.ico',
            search: 'http://en.wikipedia.org/wiki/Special:Search?search=%searchvo&go=Go',
            method: methodEncode,
            type: _TGEN
        },
        wikipediaES : { name: 'Wikipedia ES',
            icon: '',
            search: 'http://es.wikipedia.org/w/index.php?title=Especial:Search&search=%searchvo&go=Go',
            method: methodEncode,
            type: _TGEN
        },
        google : { name: 'Google',
            icon: 'http://www.google.es/favicon.ico',
            search: 'http://www.google.es/search?q=%searchvo',
            method: methodEncode,
            type: _TGEN
        },
        mininova : { name: 'Mininova',
            icon: 'http://s.mininova.org/images/favicon.ico',
            search: 'http://www.mininova.org/search/%searchvo/4',
            method: methodEncode,
            type: _TDOWN
        },
        isohunt : { name: 'isoHunt',
            icon: 'http://isohunt.com/favicon.ico',
            search: 'http://isohunt.com/torrents/%searchvo?ihs1=2&iho1=d&iht=1',
            method: methodEncode,
            type: _TDOWN
        },
        piratebay : { name: 'The Pirate Bay',
            icon: 'http://thepiratebay.org/favicon.ico',
            search: 'http://thepiratebay.org/search/%searchvo/0/99/200',
            method: methodEncode,
            type: _TDOWN
        },
        youtorrent : { name: 'YouTorrent',
            icon: 'http://www.youtorrent.com/favicon.ico',
            search: 'http://www.youtorrent.com/tag/%searchvo',
            method: methodEscape,
            type: _TDOWN
        },
        cineclasico : { name: 'Cine-Clásico',
            icon: 'http://www.cine-clasico.com/favicon.ico',
            search: 'http://www.cine-clasico.com/foros/search.php?keywords=%searchvo&terms=all&author=&sc=1&sf=firstpost&sr=posts&sk=t&sd=d&st=0&ch=300&t=0&submit=Buscar',
            method: methodEncode,
            regreq: true,
            type: _TDOWN
        },
        divxclasico : { name: 'DivX Clásico',
            icon: 'http://www.divxclasico.com/favicon.ico',
            search: 'http://www.divxclasico.com/foro/search.php?search_keywords=%searchvo&highlight=%searchvo',
            method: methodEncode,
            regreq: true,
            type: _TDOWN
        },
        allzine : { name: 'AllZine',
            icon: '%3D',
            search: 'http://www.allzine.org/Foro/index.php?action=search2&search=%searchtr&subject_only=1',
            method: methodEncode,
            regreq: true,
            type: _TDOWN
        },
        vagos : { name: 'Vagos.es',
            icon: 'http://wf1.vagos.es/favicon.ico',
            search: 'http://buscador.wamba.com/buscar/index.php?cx=004825717204032381724%3Ajfqcclqsbpi&cof=FORID%3A11&q=%searchtr',
            method: methodEncode,
            type: _TDOWN
        },                   /*
         vagos : { name: 'PorDescargaDirecta.es',
         icon: 'http://http://pordescargadirecta.com/foro/favicon.ico/favicon.ico',
         search: 'http://buscador.wamba.com/buscar/index.php?cx=004825717204032381724%3Ajfqcclqsbpi&cof=FORID%3A11&q=%searchtr',
         method: methodEncode,
         type: _TDOWN
         },                     */
        clansa : { name: 'Clan-Sudamérica',
            icon: 'http://www.clan-sudamerica.net/invision/favicon.ico',
            search: 'http://www.clan-sudamerica.com.ar/invision/index.php?act=Search&CODE=01&keywords=%searchtr&namesearch=&forums%5B%5D=all&searchsubs=1&prune=0&prune_type=newer&sort_key=last_post&sort_order=desc&search_in=titles&result_type=topics',
            method: methodEncode,
            regreq: true,
            type: _TDOWN
        },
        argenteam : { name: 'aRGENTeaM',
            icon: 'http://www.argenteam.net/favicon.ico',
            search: 'http://foro.argenteam.net/search.php?keywords=%searchvo&terms=all&author=&fid%5B%5D=68&fid%5B%5D=69&fid%5B%5D=70&sc=1&sf=firstpost&sr=posts&sk=t&sd=d&st=0&ch=500&t=0&submit=Buscar',
            method: methodEncode,
            regreq: true,
            type: _TDOWN
        },
        fileheaven : { name: 'fileheaven',
            icon: 'http://www.fileheaven.org/favicon.ico',
            search: 'http://www.fileheaven.org/forum/search.php?mode=results&search_keywords=%searchvo&search_terms=all&search_author=&search_forum=-1&search_time=0&search_fields=subjonly&search_cat=-1&sort_by=0&sort_dir=DESC&show_results=topics&return_chars=200',
            method: methodEncode,
            regreq: true,
            type: _TDOWN
        },
        taringa : { name: 'Taringa!',
            icon: 'http://i.t.net.ar/images/favicon.ico',
            search: 'http://www.taringa.net/buscador/?q=%searchvo&categoria=13&sort_by=0&autor=',
            method: methodEncode,
            type: _TDOWN
        },
        opensubtitles : { name: 'OpenSubtitles',
            icon: 'http://static.opensubtitles.org/favicon.ico',
            search: 'http://www.opensubtitles.com/es/search2/sublanguageid-spa/moviename-%searchvo',
            method: methodEncode,
            type: _TSUB
        },
        solosubtitulos : { name: 'solosubtitulos',
            icon: 'http://www.solosubtitulos.com/imagenes_web/favicon.ico',
            search: 'http://www.solosubtitulos.com/?q=%searchvo',
            method: methodEscape,
            type: _TSUB
        },
        subdivx : { name: 'SubDivX',
            icon: 'http://www.subdivx.com/favicon.ico',
            search: 'http://www.subdivx.com/index.php?buscar=%searchvo&accion=5&subtitulos=1&realiza_b=1',
            method: methodEscape,
            type: _TSUB
        },
        titles : { name: 'titles.box.sk',
            icon: '%3D',
            search: 'http://titles.box.sk/index.php?z3=%searchvo&rad1=an&aka=1&alt=1&jaz=9&z=datum+desc&days=0&pid=subt2&p=as&cas=1215777572&bt1=ADVANCED+SEARCH',
            method: methodEscape,
            type: _TSUB
        },
        foreingddl: {name: 'ForiegnMoviesDDL',
            icon: 'http://www.blogger.com/favicon.ico',
            search: 'http://www.foriegnmoviesddl.com/search?q=%searchvo',
            method: methodEscape,
            type: _TDOWN
        },
        daleya: {name: 'DaleYA',
            icon: 'http://www.daleya.com/Images/icons/cur.gif',
            search: 'http://www.daleya.com/?query=%searchvo{OPTIONS}',
            method:methodEscape,
            type: _TDOWN,
            options: {1:{name:'Megaupload',text:'megaupload.com'},
                2:{name:'Badongo',text:'badongo.com'},
                3:{name:'Rapidshare',text:'rapidshare.com'},
                4:{name:'Mediafire',text:'mediafire.com'},
                5:{name:'Gigasize',text:'gigasize.com'},
                6:{name:'SeriesYonkis',text:'seriesyonkis.com'},
                7:{name:'FileFactory',text:'filefactory.com'},
                8:{name:'FileFront',text:'filefront.com'},
                9:{name:'PeliculasYonkis',text:'peliculasyonkis.com'},
                10:{name:'TurboUpload',text:'turboupload.com'},
                11:{name:'Multiply',text:'multiply.com'},
                12:{name:'SendSpace',text:'sendspace.com'}
            } ,
            getOptions:function() {
                var tmp = "";
                for (opt in this.options) {
                    var option = this.options[opt];
                    if (getPreference(this.name + ".opt." + option.name, true)) {
                        tmp += "&daleyaid[]=" + opt;
                    }
                }
                return  tmp;
            }
        }
    };

    /*
     getElementsByClassName
     Written by Jonathan Snook, http://www.snook.ca/jonathan
     Add-ons by Robert Nyman, http://www.robertnyman.com
     */

    function $id(v) {
        return(d.getElementById(v));
    }

    function getElementsByClassName(oElm, strTagName, strClassName) {
        var arrElements = (strTagName == "*" && oElm.all) ? oElm.all : oElm.getElementsByTagName(strTagName);
        var arrReturnElements = new Array();
        strClassName = strClassName.replace(/\-/g, "\\-");
        var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
        var oElement;
        for (var i = 0; i < arrElements.length; i++) {
            oElement = arrElements[i];
            if (oRegExp.test(oElement.className)) {
                arrReturnElements.push(oElement);
            }
        }
        return (arrReturnElements);
    }

    function formatDate(fDate) {
        if (typeof fDate != 'undefined') {
            var yyyy = fDate.getFullYear();
            var m = fDate.getMonth() + 1;
            var d = fDate.getDate();
            var h = fDate.getHours();
            var n = fDate.getMinutes();
            var nn = n < 10 ? "0" + n : n;
            var s = fDate.getSeconds();
            var ss = s < 10 ? "0" + s : s;
            return d + "/" + m + "/" + yyyy + " a las " + h + ":" + nn + ":" + ss;
        } else {
            return "";
        }
    }

    function findNode(context, xpath) {
        return d.evaluate(xpath, context, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    }

    function findNodes(context, xpath) {
        return d.evaluate(xpath, context, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    }

    function findNodesArray(context, xpath) {
        var nodos = [];
        var iterator = findNodes(context, xpath);
        while ((nodo = iterator.iterateNext()) != null) {
            nodos.push(nodo);
        }
        return nodos;
    }


    function doPost(url, data, cb) {
        GM_xmlhttpRequest({
            method: "POST",
            url: url,
            headers:{'Content-type':'application/x-www-form-urlencoded'},
            data:encodeURI(data),
            onload: function(xhr) {
                cb(xhr.responseText);
            },
            onerror: function (details) {
                log("Error en el Post");
                log(" Status: " + details.status);
                log(" Status Text: " + details.statusText);
                log(" Response headers: " + details.responseHeaders);
                log(" Response Text: " + details.responseText);
            }
        });
    }

    function doGet(url, cb) {
        GM_xmlhttpRequest({
            method: "GET",
            url: url,
            onload: function(xhr) {
                cb(xhr.responseText);
            }
        });
    }

    function log(msg) {
        debuglog += '<br/>' + msg;
        GM_log(msg);
    }

    function setPreference(name, value) {
        //log('Guardo preferencia: ' + name + '=' + value);
        GM_setValue('cfg.' + name, value);
    }

    function getPreference(name, def) {
        def = (typeof def == "undefined") ? false : def;
        var r = GM_getValue('cfg.' + name);
        return (typeof r == "undefined") ? def : r;
    }

    function getValues(start) {
        var result = new Array();
        var values = GM_listValues();
        for (ix in values) {
            var name = values[ix];
            if (name.indexOf(start) == 0) {
                result.push(name.substr(start.length));
            }
        }
        return result;
    }

    function deleteValues(start) {
        log("DeleteValues: ");
        var values = GM_listValues();
        for (var ix in values) {
            var name = values[ix];
            if (name.indexOf(start) == 0) {
                log("valor: " + values[ix]);
                GM_deleteValue(name);
            }
        }
    }


    function showLog() {
        GM_addStyle('#backgroundLayer { width: 100%; height: 100%; background-color: black; position: fixed; left: 0; right: 0; top: 0; bottom: 0; opacity: .7; }');
        GM_addStyle('#board { color: black; background-color: #def; text-align: left; border: 4px solid gray; width: 50%; height: 70%; opacity: 1; margin: auto; position: fixed; left: 0; right: 0; top: 0; bottom: 0; overflow: auto; }');
        var background = d.createElement('DIV');
        background.id = 'backgroundLayer';
        var board = d.createElement('div');
        board.id = 'board';
        board.innerHTML = '<code>' + debuglog + '</code>';
        d.body.appendChild(background);
        d.body.appendChild(board);
        $id("backgroundLayer").addEventListener("click", hideLog, true);
    }

    function hideLog() {
        d.body.removeChild($id('board'));
        d.body.removeChild($id('backgroundLayer'));
    }

    function goToHomepage() {
        location.href = homepage;
    }

    function isFlagImg(img) {
        return img.src.search(/\/countries\//ig) > -1;
    }

    function inSection(section) {
        return url.search(eval(sections[section])) > -1;
    }

    function inSections(s) {
        var value = false;
        var i = 0;
        while (!value && i < s.length) {
            value = url.search(eval(sections[s[i]])) > -1;
            i++;
        }
        return value;
    }


    var countriesCodes = {
        "Afganistán":"AF","Albania":"AL","Alemania del Este (RDA)":"FD","Alemania del Oeste (RFA)":"FF",
        "Alemania":"DE","Andorra":"AD","Angola":"AO","Antigua y Barbuda":"AG","Arabia Saudí":"SA",
        "Argelia":"DZ","Argentina":"AR","Armenia":"AM","Australia":"AU","Austria":"AT","Azerbaijan":"AZ",
        "Bahamas":"BS","Bahrein":"BH","Bangladesh":"BD","Barbados":"BB","Bélgica":"BE","Belize":"BZ",
        "Benín":"BJ","Bolivia":"BO","Bosnia - Herzegovina":"BA","Botswana":"BW","Brasil":"BR",
        "Brunei":"BN","Bulgaria":"BG","Burkina Faso":"BF","Burundi":"BI","Bután":"BT","Cabo Verde":"CV",
        "Camboya":"KH","Camerún":"CM","Canadá":"CA","Chad":"TD","Checoslovaquia":"ZX","Chile":"CL",
        "China":"CN","Chipre":"CY","Colombia":"CO","Comores":"KM","Congo":"CG","Corea del Norte":"KP",
        "Corea del Sur":"KR","Costa de Marfil":"CI","Costa Rica":"CR","Croacia":"HR","Cuba":"CU","Dinamarca":"DK",
        "Dominica":"DM","Ecuador":"EC","EEUU":"US","Egipto":"EG","El Salvador":"SV","Emiratos Árabes":"AE",
        "Eritrea":"ER","Eslovaquia":"SK","Eslovenia":"SI","España":"ES","Estados Unidos":"US","Estonia":"EE",
        "Etiopía":"ET","Fidji":"FJ","Filipinas":"PH","Finlandia":"FI","Francia":"FR","Gabón":"GA",
        "Gambia":"GM","Georgia":"GE","Ghana":"GH","Granada":"GD","Grecia":"GR","Guatemala":"GT",
        "Guinea Bissau":"GW","Guinea Ecuatorial":"GQ","Guinea":"GN","Guyana":"GY","Haití":"HT","Holanda":"NL",
        "Honduras":"HN","Hong Kong":"HK","Hungría":"HU","India":"IN","Indonesia":"ID","Irak":"IQ","Irán":"IR",
        "Irlanda":"IE","Islandia":"IS","Israel":"IL","Italia":"IT","Jamaica":"JM","Japón":"JP","Jordania":"JO",
        "Kazajstán":"KZ","Kenia":"KE","Kirguizstán":"KG","Kuwait":"KW","Laos":"LA","Lesotho":"LS",
        "Letonia":"LE","Líbano":"LB","Liberia":"LR","Libia":"LY","Liechtenstein":"LI","Lituania":"LT",
        "Luxemburgo":"LU","Macedonia":"MK","Madagascar":"MG","Malasia":"MY","Malawi":"MW",
        "Maldivas":"MV","Mali":"ML","Malta":"MT","Marruecos":"MA","Marshall (Islas)":"MH","Mauricio (Isla)":"MU",
        "Mauritania":"MR","México":"MX","Micronesia":"FM","Moldavia":"MD","Mónaco":"MC",
        "Mongolia":"MN","Montenegro":"ME","Mozambique":"MZ","Myanmar - Birmania":"MM","Namibia":"NA",
        "Nepal":"NP","Nicaragua":"NI","Níger":"NE","Nigeria":"NG","Noruega":"NO","Nueva Zelanda":"NZ",
        "Omán":"OM","Palau":"PW","Panamá":"PA","Papuasia Nueva Guinea":"PG","Paquistán":"PK","Paraguay":"PY",
        "Perú":"PE","Polonia":"PL","Portugal":"PT","Puerto Rico":"PR","Qatar":"QA","RDA":"FD",
        "Reino Unido":"GB","Rep. Centroafricana":"CF","Rep. Dominicana":"DO","República Checa":"CZ","RFA":"FF",
        "Ruanda":"RW","Rumanía":"RO","Rusia":"RU","Samoa":"WS","San Marino":"SM","Santo Tomé y Príncipe":"ST",
        "Senegal":"SN","Serbia y Montenegro":"RR","Serbia":"RS","Seychelles":"SC","Sierra Leona":"SL","Singapur":"SG",
        "Siria":"SY","Somalia":"SO","Sri Lanka":"LK","Sudán":"SD","Suecia":"SE","Suiza":"CH","Suráfrica":"ZA",
        "Surinam":"SR","Swazilandia":"SZ","Tailandia":"TH","Taiwán":"TW","Tajikistan":"TJ","Tanzania":"TZ",
        "Territorios Palestinos":"PS","Togo":"TG","Trinidad y Tobago":"TT","Túnez":"TN","Turkmenistán":"TM","Turquía":"TR",
        "Ucrania":"UA","Uganda":"UG","Unión Soviética (URSS)":"ZY","Unión Soviética":"ZY","URSS":"ZY","Uruguay":"UY",
        "USA":"US","Uzbekistan":"UZ","Vanuatú":"VU","Venezuela":"VE","Vietnam":"VN","Yemen":"YE",
        "Yugoslavia":"YU","Zambia":"ZM","Zimbabwe":"ZW"
    };

    function getCountryCode(country) {
        return countriesCodes[country];
    }


    // ************************ PREFERENCIAS *********************************************

    function preferences() {
        function showPreferences() {
            log("Mostrar preferencias");

            GM_addStyle('#backgroundLayer { width: 100%; height: 100%; background-color: black; position: fixed; left: 0; right: 0; top: 0; bottom: 0; opacity: .7; }');
            GM_addStyle('#fap_prefs { color: black; background-color: #def; text-align: center; border: 4px solid gray; width: 70%; height: 90%; opacity: 1; margin: auto; position: fixed; left: 0; right: 0; top: 0; bottom: 0; overflow: auto; }');
            GM_addStyle('#fap_prefs>#closeButton { width: 22px; height: 22px; margin: 0; padding: 0; position: absolute; right: 0; top: 0; background-image: url(' + closeimg + '); opacity: .5; }');
            GM_addStyle('#fap_prefs>#closeButton:hover { opacity: 1; }');
            GM_addStyle('#fap_prefs>h1 { font-size: x-large; }');
            GM_addStyle('#fap_prefs>h2 { font-size: large; font-style: italic; }');
            GM_addStyle('#fap_prefs>table { border: 1; margin-left: auto; margin-right: auto; }');
            GM_addStyle('#fap_prefs>table>caption { border: 1; margin-left: auto; margin-right: auto; }');
            GM_addStyle('#fap_prefs>button { margin: 2em; }');
            GM_addStyle('#fap_prefs img { width: 16px; height: 16px; }');
            GM_addStyle('#fap_prefs th { background-color: black; color: white; font-style: italic; }');
            GM_addStyle('#fap_prefs>table { border: 1px solid black; }');
            GM_addStyle('#fap_prefs td.sites { border: 1px solid black; }');
            GM_addStyle('#fap_prefs label:hover { text-decoration: none; }');
            GM_addStyle('#fap_prefs .puntuacion { width: 300px; margin-left: auto; margin-right: auto; }');
            GM_addStyle('#fap_prefs legend { font-weight: bold; }');
            GM_addStyle('#fap_prefs .regreq { font-weight: bold; color: red }');
            GM_addStyle('#fap_prefs .viewSuboptions {margin-left:4px;cursor:pointer;width:9px;height:9px;}');
            GM_addStyle('#fap_prefs .subOptions {background-color:#eef;display:none;border:1px solid black;margin-left:10%;font-size:90%;}');

            var background = d.createElement('DIV');
            background.id = 'backgroundLayer';
            d.body.appendChild(background);

            var prefs = d.createElement('DIV');
            var iconTemplate = '<img src="{ICON}" alt="icono de {NAME}" title="{TITLE}"/>';
            var linkTemplate = '<label title="{TITLE}"><input type="checkbox" name="{NAME}" checked></input>{ICON}&nbsp;{NAME}{REGISTRO}</label>{OPTIONS}</br>';
            var subOptionTemplate = '<label title="{NAME}"><input type="checkbox" name="{NAME}" checked></input>{TEXT}</label><br/>';
            var optTemplate = '<tr><td colspan=4><label><input type="checkbox" name="{NAME}" {CHECKED}>{TEXT}</label></td></tr>';
            prefs.id = 'fap_prefs';

            var tmp = '<div id="closeButton" title="Cierra el panel de configuraci&oacute;n"></div>';
            tmp += '<h2>Panel de configuraci&oacute;n ' + appName + ' versi&oacute;n ' + appVersion + '</h2>';
            tmp += '<table>';
            tmp += '<thead><tr>';
            tmp += '<th><label><input type="checkbox" name="verCine" >Cine</label></th>';
            tmp += '<th><label><input type="checkbox" name="verGeneral" >General</label></th>';
            tmp += '<th><label><input type="checkbox" name="verDescargas" >Descargas</label></th>';
            tmp += '<th><label><input type="checkbox" name="verSubtitulos" >Subtitulos</label></th>';
            tmp += '</thead><tbody><tr valign="top">';
            var types = [_TFILM, _TGEN, _TDOWN, _TSUB];
            for (var t in types) {
                tmp += '<td class="sites">';
                for (var i in linkSites) {
                    if (linkSites[i].type == types[t]) {
                        var name = linkSites[i].name;
                        var title = name;
                        if (linkSites[i].regreq) title += ' (requiere registro)';
                        var text = linkTemplate.replace(/{ICON}/g, iconTemplate);
                        text = text.replace(/{ICON}/g, linkSites[i].icon).replace(/{NAME}/g, name);
                        text = text.replace(/{TITLE}/g, (linkSites[i].regreq) ? name + ' (requiere registro' : name);
                        text = text.replace(/{REGISTRO}/g, (linkSites[i].regreq) ? ' <span class="regreq">(*)</span>' : '');
                        if (linkSites[i].search.indexOf("{OPTIONS}") > -1) {
                            var htmlOptions = '<img src=' + img_plus + ' id= "' + name + '" class="viewSuboptions"><div class="subOptions" id="subOptions' + name + '" style="display:none;">';
                            for (var j in linkSites[i].options) {
                                var option = linkSites[i].options[j];
                                htmlOptions += subOptionTemplate.replace(/{NAME}/g, name + ".opt." + option.name).replace(/{TEXT}/g, option.text);
                            }
                            text = text.replace(/{OPTIONS}/g, htmlOptions + '</div>');
                        } else {
                            text = text.replace(/{OPTIONS}/g, "");
                        }

                        tmp += text;
                    }
                }
                tmp += '</td>';
            }
            tmp += '</tr>';
            tmp += optTemplate.replace(/{NAME}/g, 'newwindow').replace(/{TEXT}/g, 'Abrir los enlaces en una nueva ventana');
            tmp += '<tr><td colspan=4>Los sitios marcados con <span class="regreq">(*)</span> requieren registro.</td></tr>';

            tmp += '<tr><td colspan="4"><fieldset><legend>Posici&oacute;n de los enlaces a webs externas</legend>';
            tmp += '<label><input type="radio" name="linksPosition" value="default">Integrados en la ficha de la pelicula</input></label>';
            tmp += '<label><input type="radio" name="linksPosition" value="inTitle">En el titulo de la pelicula</input></label>';
            tmp += '<label><input type="radio" name="linksPosition" value="inPanel">Panel derecho, debajo de la puntuaci&oacute;n</input></label>';
            tmp += '</fieldset><hr></td></tr>';


            // Nuevas preferencias
            for (pref in preferencesOptions) {
                var t = optTemplate.replace(/{NAME}/g, preferencesOptions[pref].name).replace(/{TEXT}/g, preferencesOptions[pref].text);
                tmp += t.replace(/{CHECKED}/g, preferencesOptions[pref].def ? 'checked' : '');
            }
            // Limite en recomendaciones y TOPs
            var limite = getPreference('limit', 20);
            tmp += '<tr><td colspan=4><label>N&deg; de pel&iacute;culas a mostrar en Recomendaciones y TOP: <input type="text" value="' + limite + '" name="limit"></label></td></tr>';

            tmp += '</tbody></table>';

            tmp += '<br/><fieldset class="puntuacion"><legend>Estilo de las puntuaciones</legend><div style="text-align: left"><label><input type="radio" name="ratingStyle" value="default" >Estilo por defecto</input></label><br/>';
            for (t in ratingStyles) {
                tmp += '<label><input type="radio" name="ratingStyle" value="' + ratingStyles[t].code + '">' + ratingStyles[t].name + ': <img src="' + ratingStyles[t].iconOn + '"><img src="' + ratingStyles[t].iconOn + '"><img src="' + ratingStyles[t].iconOn + '"><img src="' + ratingStyles[t].iconHalf + '"><img src="' + ratingStyles[t].iconOff + '"><img src="' + ratingStyles[t].iconOff + '"></input></label><br/>';
            }
            tmp += '</div></fieldset>';

            tmp += '<button id="saveButton" title="Guarda las preferencias y cierra el panel de configuraci&oacute;n">Guardar preferencias</button>';

            prefs.innerHTML += tmp;
            d.body.appendChild(prefs);
            $id("saveButton").addEventListener("click", savePreferences, true);
            $id("closeButton").addEventListener("click", hidePreferences, true);
            $id("backgroundLayer").addEventListener("click", hidePreferences, true);
            loadPreferences();
            setSubOptionsEvents();

            log("-mostradas preferencias");
        }

        function showSubOptionPanel() {
            var element = $id("subOptions" + this.id);
            if (element.style.display != 'none') {
                element.style.display = "none";
                this.src = img_plus;
            } else {
                element.style.display = "block";
                this.src = img_minus;
            }
        }

        function setSubOptionsEvents() {
            var imagenes = getElementsByClassName(d, "img", "viewSuboptions");
            for (i in imagenes) {
                var img = imagenes[i];
                img.addEventListener("click", showSubOptionPanel, false);
            }
        }

        // Por ahora solo los radio, preparar para todos
        function loadPreferences() {
            var xpath = 'id("fap_prefs")//input';
            var nodo;
            var iterator = findNodes(d, xpath);
            while ((nodo = iterator.iterateNext()) != null) {
                var valor = getPreference(nodo.name, "undefined");
                switch (nodo.type) {
                    case "checkbox":nodo.checked = (valor != "undefined") ? valor : nodo.checked; break;
                    //case "text":nodo.value = (valor != "undefined") ? valor : "";break;
                    case "radio":nodo.checked = (valor != "undefined") ? (nodo.value == valor) : (nodo.value == "default");break;
                }
            }
        }

        function savePreferences() {
            var xpath = 'id("fap_prefs")//input';
            var iterator = findNodes(d, xpath);
            var nodo = null;
            while (nodo = iterator.iterateNext()) {
                switch (nodo.type) {
                    case "checkbox":setPreference(nodo.name, nodo.checked);break;
                    case "text":setPreference(nodo.name, nodo.value);break;
                    case "radio":if (nodo.checked) {
                        setPreference(nodo.name, nodo.value)
                    };break;
                }
            }
            alert('Los cambios tendrán efecto al recargar la página.');
            hidePreferences();
        }

        function hidePreferences() {
            d.body.removeChild($id('fap_prefs'));
            d.body.removeChild($id('backgroundLayer'));
        }

        showPreferences();
        // ************************ FIN PREFERENCIAS *********************************************
    }

    // Comprueba los cambios en las puntuaciones de los amigos
    function doFriendsRatingChange() {
        var table = "//span[text()='Nombre/Nick']/ancestor::*[position()=4]".findNode();
        log("RatingChange");
        for (var i = 1; i < table.rows.length - 1; ++i) {
            var userid = table.rows[i].cells[0].firstChild.href.split('=')[1];
            var name = table.rows[i].cells[0].firstChild.textContent;
            var ratedfilms = table.rows[i].cells[3].textContent.split('.').join('');
            var criticas = table.rows[i].cells[4].textContent;
            var friendstr = GM_getValue("friends." + userid);
            if (typeof friendstr != 'undefined') {
                var friend = eval(friendstr);
                var dif = ratedfilms - friend.films;
                var prefix;
                if (dif != 0) {
                    prefix = dif > 0 ? '+' : '';
                    table.rows[i].cells[3].bgColor = dif > 0 ? 'lightgreen' : '#FF6666';
                    table.rows[i].cells[3].textContent += ' (' + prefix + dif + ')';
                }
                ;
                if (typeof friend.criticas != 'undefined') {
                    dif = criticas - friend.criticas;
                    if (dif != 0) {
                        prefix = dif > 0 ? '+' : '';
                        table.rows[i].cells[4].bgColor = dif > 0 ? 'lightgreen' : '#FF6666';
                        table.rows[i].cells[4].textContent += '(' + prefix + dif + ')';
                    }
                }
            }
            GM_setValue("friends." + userid, {name:name,films:ratedfilms,criticas:criticas}.toSource());
        }
        log("-fin RatingChange");
    }

    // CAMBIOS EN ALMAS GEMELAS
    // @todo: cambiar los nombres de las variables/metodos a algo medianamente coherente
    function soulMates() {


        function getSavedSoulMatesLists() {
            var ssml = eval(GM_getValue("ssml"));
            if (typeof ssml == "undefined") {
                ssml = new Object();
                ssml.items = new Array();
                ssml.last = 0;
            }
            return ssml;
        }

        function getSavedSoulMates(index) {
            return eval(GM_getValue("sml." + index));
        }

        function saveSoulMates(ssml, index, sm) {
            GM_setValue("sml." + index, sm.toSource());
            ssml.items.push({'index':index,'date':sm.date});
            ssml.last = index;
            GM_setValue("ssml", ssml.toSource());
        }


        function extractSoulMates(table) {
            var soulMates = new Object;
            soulMates.sm = [];
            for (i = 1; i < NUM_SM; i++) {
                var row = table.rows[i];
                var id = row.cells[1].innerHTML.split("=")[2].split('"')[0];
                var name = row.cells[1].firstChild.firstChild.textContent;
                var affinity = row.cells[2].firstChild.firstChild.innerHTML.replace(',', '.');
                var votes = row.cells[3].firstChild.innerHTML;
                soulMates.sm[i] = {'id':id,'name':name,'affinity':affinity,'votes':votes};
            }
            soulMates.date = formatDate(new Date());
            return soulMates;
        }

        function findChangesAllSoulMates(soulMates, previous) {
            var changesAll = new Object;
            var siguen = "";
            changesAll.changed = false;
            var rows = [];
            for (j = 1; j < NUM_SM; j++) {
                var changes = new Object;
                var sm = soulMates.sm[j];
                var found = false;
                var i = 0;
                while ((++i < NUM_SM) && !found) {
                    if (previous.sm[i]['id'] == sm['id']) {
                        found = true;
                        changes.pos = i - j;
                        changes.affinity = sm['affinity'] - previous.sm[i]['affinity'];
                        changes.votes = sm['votes'] - previous.sm[i]['votes'];
                        changes.changed = (changes['pos'] != 0) || (changes['affinity'] != 0) || (changes['votes'] != 0);
                    }
                }
                changes.found = found;
                if (found) {
                    siguen += "," + sm['name'];
                }
                rows[j] = changes;
                changesAll.changed = changesAll.changed || changes.changed || !found;
            }
            // Buscamos los caidos de la lista
            var caidos = [];
            for (j = 1; j < NUM_SM; j++) {
                var user = previous.sm[j].name;
                if (siguen.indexOf(user) < 0) {
                    caidos.push(user);
                }
            }
            changesAll.rows = rows;
            changesAll.fallen = caidos;
            changesAll.date = formatDate(new Date());
            return changesAll;
        }

        function clearSoulMatesTable(table) {
            for (var i = 1; i < NUM_SM; i++) {
                var row = table.rows[i];
                row.cells[1].innerHTML = "&nbsp;";
                row.cells[4].innerHTML = "&nbsp;";
                row.cells[6].innerHTML = "&nbsp;";
            }
        }

        function prepareSoulMatesTable(table) {
            table.rows[0].cells[0].colSpan = 2;
            table.rows[0].cells[2].colSpan = 2;
            table.rows[0].cells[3].colSpan = 2;
            for (var i = 1; i < table.rows.length; i++) {
                var row = table.rows[i];
                var newCell = d.createElement('TD');
                //newCell.width = 25;
                newCell.innerHTML = "&nbsp;";
                row.insertBefore(newCell, row.cells[0].nextSibling);
                newCell = d.createElement('TD');
                newCell.width = 20;
                newCell.innerHTML = "&nbsp;";
                row.insertBefore(newCell, row.cells[3].nextSibling);
                newCell = d.createElement('TD');
                newCell.width = 20;
                newCell.innerHTML = "&nbsp;";
                row.insertBefore(newCell, row.cells[5].nextSibling);
            }
        }

        function applySoulMatesChanges(table, i, changes) {
            // ¿Cambio de posicion?
            if (changes.pos > 0) {
                table.rows[i].cells[1].innerHTML = '<img src="' + upimg + '"><span style="font-size:80%;color:#1FA012;">' + changes.pos + '</span>';
            } else if (changes.pos < 0) {
                table.rows[i].cells[1].innerHTML = '<img src="' + downimg + '"><span style="font-size:80%;color:#A0121F;">' + changes.pos + '</span>';
            }
            // ¿cambio de afinidad?
            if (changes.affinity > 0) {
                table.rows[i].cells[4].innerHTML = '<span style="font-size:85%;color:#1FA012;">(+' + changes.affinity.toFixed(2) + ')</span>';
            } else if (changes.affinity < 0) {
                table.rows[i].cells[4].innerHTML = '<span style="font-size:85%;color:#A0121F;">(' + changes.affinity.toFixed(2) + ')</span>';
            }
            // ¿cambio de valoradas?
            if (changes.votes > 0) {
                table.rows[i].cells[6].innerHTML = '<span style="font-size:85%;color:#1FA012;">(+' + changes.votes + ')</span>';
            } else if (changes.votes < 0) {
                table.rows[i].cells[6].innerHTML = '<span style="font-size:85%;color:#A0121F;">(' + changes.votes + ')</span>';
            }
        }

        function applyNewSoulMate(table, i) {
            table.rows[i].cells[1].innerHTML = '<img src="' + newimg + '">';
        }

        // A&ntilde;ade la leyenda de los caidos
        function applyFallenSoulMates(table, fallen) {
            if (fallen.length > 0) {
                var tr = d.createElement('TR');
                var td = d.createElement('TD');
                td.innerHTML = 'Almas gemelas caidas de la lista: <b>' + fallen.join(', ') + '</b>';
                td.colSpan = 7;
                tr.appendChild(td);
                table.rows[1].parentNode.appendChild(tr);
            }
        }

        function applyLastChangesTime(table, date) {
            if (typeof date != "undefined") {
                var tr = d.createElement('TR');
                var td = d.createElement('TD');
                td.innerHTML = 'Ultimos cambios detectados el ' + date;
                td.colSpan = 7;
                tr.appendChild(td);
                table.rows[1].parentNode.appendChild(tr);
            }
        }

        function applyTimeMachine(table, newChanges, ssml) {
            if (!newChanges) ssml.items.pop(); // Eliminamos el tiempo actual.
            if (ssml.items.length > 1) {
                ssml.items.sort(function(a, b) {
                    return b.index - a.index;
                });
                var tr = d.createElement('TR');
                var td = d.createElement('TD');
                var html = 'Comparar con: <select id="HSML" name="HSML">';
                for (var ix in ssml.items) {
                    var index = ssml.items[ix].index;
                    var date = ssml.items[ix].date;
                    html += '<option value=' + index + '>' + date + '</option>';
                }
                html += "</select>";
                td.innerHTML = html;
                td.colSpan = 7;
                tr.appendChild(td);
                table.rows[1].parentNode.appendChild(tr);
                $id("HSML").firstChild.selected = true;
                $id("HSML").addEventListener("change", doSoulMatesHist, false);
            }
        }

        function doSoulMatesChanges(table, newChanges, changesList, ssml, historic) {
            // comparar y modificar
            var changes;
            for (i = 1; i < NUM_SM; i++) {
                changes = changesList.rows[i];
                if (changes.found) {
                    // ya la teniamos
                    if (changes.changed) {
                        applySoulMatesChanges(table, i, changes);
                    }
                }
                else {
                    // Es un alma gemela nueva
                    applyNewSoulMate(table, i);
                }
            }
            if (getPreference("SHOWSMFALLEN", true) && !historic) {
                applyFallenSoulMates(table, changesList.fallen);
            }
            if ((newChanges || getPreference("KEEPSMCHANGES"),true) && !historic) {
                applyLastChangesTime(table, changesList.date);
            }
            /* Mostrar el combo para comparar con el historico */
            if (!historic) applyTimeMachine(table, newChanges, ssml);
        }

        function getHSMSelectedIndex() {
            var select = $id("HSML");
            var index = 0;
            var nodo = select.firstChild;
            while (nodo != null && index == 0) {
                if (nodo.selected) {
                    index = nodo.value;
                }
                nodo = nodo.nextSibling;
            }
            return index;
        }

        // Comparamos los ultimos datos con el historico.
        function doSoulMatesHist() {
            var table = findNode(d, XPATH_SML);
            var ssml = getSavedSoulMatesLists();
            var currentSM = getSavedSoulMates(ssml.last);
            var index = getHSMSelectedIndex();
            var historicSM = getSavedSoulMates(index);
            var changes = findChangesAllSoulMates(currentSM, historicSM);
            log("Comparando:" + currentSM.toSource());
            log("Historico:" + historicSM.toSource());
            clearSoulMatesTable(table);
            doSoulMatesChanges(table, false, changes, ssml, true);
        }


        function doSoulMates() {
            // Leer las almas gemelas del HTML
            var table = findNode(d, XPATH_SML);
            var ssml = getSavedSoulMatesLists();
            var currentSoulMates = extractSoulMates(table);
            if (ssml.last > 0) {
                prepareSoulMatesTable(table);
                var previousSoulMates = getSavedSoulMates(ssml.last);
                var changes = findChangesAllSoulMates(currentSoulMates, previousSoulMates);
                var newChanges = changes.changed;
                var previousChanges = eval(GM_getValue('smc'));
                if (!changes.changed && (previousChanges != undefined)) {
                    log("No hay Cambios");
                    if (getPreference("KEEPSMCHANGES", true)) {
                        changes = previousChanges;
                    }
                }
                else {
                    log("Guardando los nuevos cambios");
                    GM_setValue('smc', changes.toSource());
                }
                doSoulMatesChanges(table, newChanges, changes, ssml, false);
                if (newChanges) {
                    saveSoulMates(ssml, ssml.last + 1, currentSoulMates);
                }
            }
            else {
                // Primera vez que detectamos Almas gemelas, borramos la lista de cambios
                // por si acaso
                GM_deleteValue('smc');
                saveSoulMates(ssml, ssml.last + 1, currentSoulMates);
            }
        }

        doSoulMates();
        /*
         FIN ALMAS GEMELAS
         */

    }

    function doFlag2Title() {
        log("Poner nombre del pa&iacute;s en las banderas");
        var imgs = d.getElementsByTagName('img');
        for (var i = 0; i < imgs.length; ++i)
            if (isFlagImg(imgs[i]) && imgs[i].hasAttribute('alt'))
                imgs[i].setAttribute('title', imgs[i].getAttribute('alt'));
        log("-fin nombre a banderas");
    }

    function doAlt2Title() {
        log("alt2title");
        var imgs = d.getElementsByTagName('img');
        for (var i = 0; i < imgs.length; ++i)
            if (imgs[i].hasAttribute('alt') && !imgs[i].hasAttribute('title'))
                imgs[i].setAttribute('title', imgs[i].getAttribute('alt'));
        log("-fin alt2title");
    }

    function externalLinks() {

        function extractTranslatedTitle() {
            var xpath = "//img[@src='http://www.filmaffinity.com/images/movie.gif']/parent::*/text()";
            var nodo = findNode(d, xpath);
            return nodo.textContent.clearTitle();
        }

        function extractOriginalTitle()
        {
            var xpath = '//b[text()="TITULO ORIGINAL"]/../following-sibling::*/b/text()';
            var nodo = findNode(d, xpath);
            return nodo.textContent.clearTitle();
        }

        function getLinkSitesCode(type, title, titletr) {
            var linkSiteTemplate = ' <a href="{LINK}" target="{TARGET}" ><img src="{ICON}" width=16 height=16 alt="{TITLE}" title="{TITLE}"></a>';
            var html = '';
            for (var i in linkSites) {
                // @todo: si la preferencia es false la consulta se hace dos veces, optimizar
                if (linkSites[i].type == type && ( getPreference(linkSites[i].name, true))) {
                    var sicon = linkSites[i].icon;
                    var stit = linkSites[i].name;
                    var sstr = '';
                    var target = getPreference('newwindow', true) ? '_blank' : '_self';
                    if (linkSites[i].search.search(/%searchtr/) > -1)
                        sstr = linkSites[i].search.replace(/%searchtr/, linkSites[i].method(titletr));
                    else
                        sstr = linkSites[i].search.replace(/%searchvo/, linkSites[i].method(title));
                    // Si tiene Opciones adicionales
                    if (linkSites[i].search.indexOf("{OPTIONS}") > -1) {
                        sstr = sstr.replace(/{OPTIONS}/g, linkSites[i].getOptions());
                    }
                    html += linkSiteTemplate.replace(/{LINK}/g, sstr).replace(/{ICON}/g, sicon).replace(/{TARGET}/g, target).replace(/{TITLE}/g, stit);
                }
            }
            return html;
        }

        function doAddLinksInTitle() {
            log("InterFilm");
            var originalTitle = extractOriginalTitle();
            var translatedTitle = extractTranslatedTitle();
            var xpath = "//img[@src='http://www.filmaffinity.com/images/movie.gif']/parent::*/parent::*";
            var titlediv = findNode(d, xpath);
            var types = [_TFILM, _TGEN, _TDOWN, _TSUB];
            for (var t in types) {
                var tmp = '';
                var txt = linkSitesTypes[types[t]].caption;
                if (getPreference(linkSitesTypes[types[t]].preference, true)) {
                    tmp += getLinkSitesCode(types[t], originalTitle, translatedTitle);
                }
                if (tmp != '')
                    titlediv.innerHTML += '<span style="padding-left: 1em; font-style: italic;">' + txt + tmp + '</span>';
            }
            log("-fin InterFilm");
        }

        //
        // Añade los enlaces Externos en el panel de la derecha
        //
        function doAddLinksOnPanel() {
            log("LinksOnPanel");
            var xpath = xpath = "//b[text()='TU VOTO']";
            var nodo = findNode(d, xpath);
            for (var n = 1; n < 13; n++) {
                nodo = nodo.parentNode;
            }
            ;
            var originalTitle = extractOriginalTitle();
            var translatedTitle = extractTranslatedTitle();

            var html = '<td align="center">\n <table bgcolor="#ddddff" border="0" cellpadding="0" cellspacing="1" width="100%">\n <tbody>';
            html += '<tr><td bgcolor="#ffffff">\n\n<table border="0" cellpadding="2" cellspacing="2" width="100%">\n <tbody>';
            html += '{LINKS}\n</tbody></table>\n\n </td></tr>\n </tbody></table>\n </td>';

            var linkTemplate = '<tr>\n <td align="center">\n <div style="position: relative;">\n\n';
            linkTemplate += '<div style="color: rgb(0, 51, 102); font-size: 12px;"><b>{TITLE}</b></div>\n\n</div>\n\n </td>\n </tr>\n';
            linkTemplate += '<tr><td align="center">{LINKS}</td></tr>';
            var links = "";
            var texto;

            if (getPreference("verCine", true)) {
                texto = getLinkSitesCode(_TFILM, originalTitle, translatedTitle);
                if (texto != '') links += linkTemplate.replace(/{TITLE}/g, "FICHA").replace(/{LINKS}/g, texto);
            }
            if (getPreference("verGeneral", true)) {
                texto = getLinkSitesCode(_TGEN, originalTitle, translatedTitle);
                if (texto != '') links += linkTemplate.replace(/{TITLE}/g, "BUSCAR").replace(/{LINKS}/g, texto);
            }
            if (getPreference("verDescargas", true)) {
                texto = getLinkSitesCode(_TDOWN, originalTitle, translatedTitle);
                if (texto != '') links += linkTemplate.replace(/{TITLE}/g, "DESCARGAS").replace(/{LINKS}/g, texto);
            }
            if (getPreference("verSubtitulos", true)) {
                texto = getLinkSitesCode(_TSUB, originalTitle, translatedTitle);
                if (texto != '') links += linkTemplate.replace(/{TITLE}/g, "SUBTITULOS").replace(/{LINKS}/g, texto);
            }
            var spacer = document.createElement("TR");
            spacer.innerHTML = "<td>&nbsp;</td>";
            nodo.parentNode.insertBefore(spacer, nodo.nextSibling);
            var nodoTr = document.createElement("TR");
            nodo.parentNode.insertBefore(nodoTr, nodo.nextSibling.nextSibling);
            nodoTr.innerHTML = html.replace(/{LINKS}/g, links);
        }

        //
        // Añade los enlaces Externos en la ficha de la pelicula
        //
        function doAddLinksInline() {
            log("InterFilm");

            var originalTitle = extractOriginalTitle();
            var translatedTitle = extractTranslatedTitle();

            log("-T&iacute;tulo original: " + originalTitle + " - T&iacute;tulo traducido: " + translatedTitle);

            // recogemos el tr padre de la columna 'productora'
            var xpath = "//b[text()='PRODUCTORA']/parent::*/parent::*";
            var nodoProductora = findNode(d, xpath);

            // Fichas
            addDataRow(nodoProductora, "verSubtitulos", 'SUBTITULOS', _TSUB, originalTitle, translatedTitle);
            addDataRow(nodoProductora, "verDescargas", 'DESCARGAS', _TDOWN, originalTitle, translatedTitle);
            addDataRow(nodoProductora, "verGeneral", 'BUSCAR', _TGEN, originalTitle, translatedTitle);
            addDataRow(nodoProductora, "verCine", 'FICHA', _TFILM, originalTitle, translatedTitle);

            log("-fin InterFilm");
        }

        // Añadimos los enlaces en la pagina de busqueda
        function doAddLinksSearch() {
            var xpath = "//span[text()='Resultados por título']/ancestor::*[position()=3]";
            var nodo = findNode(d, xpath);
            var busqueda = d.forms[0].elements[0].value;
            var types = [_TFILM, _TGEN, _TDOWN, _TSUB];
            var html = "<td>&nbsp;Busquedas adicionales:&nbsp;&nbsp;";
            for (var t in types) {
                var type = types[t];
                if (getPreference(linkSitesTypes[types[t]].preference, true)) {
                    html += getLinkSitesCode(type, busqueda, busqueda) + "&nbsp;&nbsp;";
                }
            }
            html += "</td>";
            var nodoTr = d.createElement('tr');
            nodoTr.innerHTML = html;
            nodo.parentNode.insertBefore(nodoTr, nodo);
        }

        function addDataRow(sibling, preference, title, type, originalTitle, translatedTitle) {
            if (getPreference(preference, true)) {
                var html = getLinkSitesCode(type, originalTitle, translatedTitle);
                if (html != "") {
                    var nodoTr = d.createElement('tr');
                    var nodoTd = d.createElement('td');
                    nodoTd.align = "right";
                    nodoTd.valign = "baseline";
                    nodoTd.innerHTML = '<b>' + title + '</b>';
                    nodoTr.appendChild(nodoTd);
                    nodoTd = d.createElement('td');
                    nodoTd.innerHTML = html;
                    nodoTr.appendChild(nodoTd);
                    sibling.parentNode.insertBefore(nodoTr, sibling.nextSibling);
                }
            }
        }

        if (inSection('Film')) {
            var doFunction;
            switch (getPreference("linksPosition", "default")) {
                case "default": doFunction = doAddLinksInline;break;
                case "inTitle": doFunction = doAddLinksInTitle;break;
                case "inPanel": doFunction = doAddLinksOnPanel;break;
            }
            doFunction();
        }
        else {
            doAddLinksSearch();
        }
        ;

    }


    function installSearchEngine() {
        log("Instalando buscador");
        window.setTimeout("window.sidebar.addSearchEngine('http://mycroft.mozdev.org/install.php/1913/filmaffinity_es.src', 'http://mycroft.mozdev.org/install.php/1913/filmaffinity_es.gif', 'FilmAffinity ES', 'as');", 50);
        log("-instalado");
    }


    function doAddExtraStats(totalCountries) {
        var tables = d.getElementsByTagName('TABLE');
        var table = null;
        for (var i = tables.length - 1; i > 0; --i) {
            if (tables[i].textContent.search("Nº de críticas validadas:") > -1) {
                table = tables[i];
                break;
            }
        }

        var clon = table.rows[table.rows.length - 2].cloneNode(true);
        clon.cells[0].textContent = "Nº paises diferentes:";
        clon.cells[1].innerHTML = "<b>" + totalCountries + "</b>";
        table.rows[table.rows.length - 2].parentNode.insertBefore(clon, table.rows[table.rows.length - 1]);
    }

    var limitUrls = ['/es/topgen.php','/es/smsrec.php'];
    /*
     * Modifica los men&uacute;s originales de FA
     */
    function doAlterLimits() {
        var xpath = "";
        var nodo = null;
        var limit = getPreference("limit", 20);
        for (ix in limitUrls) {
            xpath = '//a[@href="' + limitUrls[ix] + '"]';
            nodo = findNode(d, xpath);
            if (typeof nodo != "undefined") {
                nodo.href = nodo.href + "?limit=" + limit;
            }
        }
    }


    function doCaptureLists() {
        log('Captura Listas');
        var table = '/html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/span[text()="Nombre"]/ancestor::*[position()=3]'.findNode();
        var listas = [];
        deleteValues("list.");
        for (var i = 1; i < table.rows.length; i++) {
            var listName = table.rows[i].cells[0].firstChild.firstChild.data;
            if (listName.indexOf('(') != -1)
                listName = listName.substr(0, listName.indexOf('(')).trim();
            var listId = table.rows[i].cells[0].firstChild.href.split('=')[1];
            listas[i] = {'id':listId,'name':listName};
            log('lista: (' + listId + ') ' + listName);
            GM_setValue("list." + listId, listName);
        }

        log('Fin captura listas');
    }

    function ratingStyle() {

        // TODO: modificar
        function getRatingFromImg(img) {
            if (img.src.indexOf('ns.gif') > - 1) return 0;
            return img.src.split('ratings/')[1].split('.')[0];
        }

        function getRatingImageCode(j, rating, schema) {
            var imgTemplate = "<img src='{SOURCE}' class='ratingimg' alt='" + rating + ' - ' + ratings[rating] + "'>";
            return imgTemplate.replace(/{SOURCE}/g, j > rating ? ratingStyles[schema].iconOff : ratingStyles[schema].iconOn);
        }

        function doChangeRatingStyle() {
            log("Cambiar estilo de las puntuaciones");
            var schema = getPreference('ratingStyle', 'default');
            if (schema == 'default') return;
            // Obtenemos las imagenes a cambiar
            var images = "//img[contains(@src,'ratings')]".findNodesArray();
            for (var ix in images) {
                var img = images[ix];
                var rating = getRatingFromImg(img);
                if (rating > 0) {
                    var html = "";
                    for (var j = 1; j < 11; j++) {
                        html += getRatingImageCode(j, rating, schema);
                    }
                    var divNode = d.createElement('DIV');
                    divNode.style.width = "160";
                    divNode.innerHTML = html;
                    img.parentNode.insertBefore(divNode, img);
                    img.parentNode.removeChild(img);
                }
            }
        }

        doChangeRatingStyle();
    }

    function doAddContriesFlags() {
        log("Añadir banderitas");
        var styleTemplate = 'padding-left: 19px; background: white url("{URL}") no-repeat scroll center left';
        var baseUrl = "http://www.filmaffinity.com/imgs/countries/";
        var tables = d.getElementsByTagName('TABLE');
        var table = null;
        for (var i = tables.length - 1; i > 0; --i) {
            if (tables[i].textContent.search('Mis votos por país') > -1) {
                table = tables[i];
                break;
            }
        }

        for (i = 1; i < table.rows.length; ++i) {
            table.rows[i].cells[0].setAttribute('style',
                    styleTemplate.replace(/{URL}/g, baseUrl + getCountryCode(table.rows[i].cells[0].textContent) + ".jpg"));
        }
        var countries = table.rows.length - 1;
        log("-fin añadir banderitas. total=" + countries);
        return countries;
    }


    function doAddFlagsToOptionsSel() {
        if (inSection('TopGen'))
            doAddFlagsToOptions(d.forms[1].elements[2]);
        else if (inSection('AdvSearch'))
            doAddFlagsToOptions(d.forms[1].elements[9]);
        else if (inSection('UptMyData'))
                doAddFlagsToOptions(d.forms[1].elements[5]);
    }

    function doAddFlagsToOptions(o) {
        //var paises = "";
        //var code = "";
        log("Añadir banderas a options");
        for (var i = 0; i < o.options.length; ++i) {
            o.options[i].setAttribute('style', 'padding-left: 19px; background: white url("http://www.filmaffinity.com/imgs/countries/' + o.options[i].value + '.jpg") no-repeat scroll center left');
            if (typeof getCountryCode(o.options[i].textContent) == "undefined") {
                //paises += o.options[i].textContent + ",";
                //code += '"' + o.options[i].textContent + '":"' + o.options[i].value + '",';
            }
        }
        //log(paises);
        //log(code);
        o.setAttribute('style', 'padding-left: 19px; background: white url("http://www.filmaffinity.com/imgs/countries/' + o.options[o.selectedIndex].value + '.jpg") no-repeat scroll center left');
        o.addEventListener("change", doAddFlagsToOptionsSel, true);
        o.addEventListener("keyup", doAddFlagsToOptionsSel, true);

        log("-fin banderas a options");
    }

    function doAddFlagsToFriends() {
        var table = "//span[text()='Nombre/Nick']/ancestor::*[position()=4]".findNode();
        for (var i = 1; i < table.rows.length - 1; i++) {
            var localidad = table.rows[i].cells[1].textContent.reverse();
            var pais = localidad.substr(1,localidad.indexOf('(')-1).reverse();
            var code = getCountryCode(pais);
            table.rows[i].cells[1].setAttribute('style', 'padding-left: 22px; background: white url("http://www.filmaffinity.com/imgs/countries/' + code + '.jpg") no-repeat scroll center left');

        }
    }

    function quickList() {


        function hideQuickListPanel() {
            d.body.removeChild($id('panel_listas'));
            d.body.removeChild($id('backgroundLayer'));
        }

        function getNumOfLists() {
            var anchorTr = "//div/b[text()='LISTAS']/ancestor::*[position()=3]".findNode();
            if (anchorTr.parentNode.rows.length == 2) {
                return 0;
            } else {
                var texto = anchorTr.parentNode.rows[1].firstChild.textContent;
                return parseInt(texto.split(" en ")[1].split(" de ")[0]);
            }
        }

        function updateListCount(delta) {
            var comentario = "Esta película se encuentra en <b>{NUM}</b> de tus listas.";
            var actual = getNumOfLists();
            var nuevo = actual + delta;
            var nodo;
            var texto = "";
            var anchorTr = "//div/b[text()='LISTAS']/ancestor::*[position()=3]".findNode();
            if (actual == 0) {
                var nodoTr = d.createElement("TR");
                var nodoTd = d.createElement('TD');
                nodoTd.align = "center";
                nodoTd.innerHTML = "nbsp;";
                nodoTr.appendChild(nodoTd);
                anchorTr.parentNode.insertBefore(nodoTr, anchorTr.nextSibling);
            }
            if (nuevo > 0) {
                texto = comentario.replace(/{NUM}/g, nuevo);
                nodo = anchorTr.parentNode.rows[1].cells[0];
                nodo.innerHTML = texto;
            } else {
                anchorTr.parentNode.removeChild(anchorTr.parentNode.rows[1]);
            }
        }

        function doAddFilmToList(film, list) {
            log("Añadiendo/Eliminando pelicula " + film + " a lista " + list);
            var nodo = $id(list);
            var remove = false;
            if (nodo.className == "delListItem") {
                if (confirm("¿Desea eliminar la pelicula de esta lista?")) {
                    remove = true;
                } else {
                    hideQuickListPanel();
                    return;
                }
            }
            var url = "http://www.filmaffinity.com/es/edtmovielists.php?movie_id=";
            url += film + "&rp=%2Fes%2Ftour.php%3Fidtour%3D29";
            //var panel = $id('panel_listas');
            //panel.style.textAlign = "center";
            //panel.style.verticalAlign = "middle";
            //panel.style.display = "table-cell";
            //var alto = ((panel.clientHeight) / 2) - 16;
            //var ancho = ((panel.clientWidth) / 2) - 16;
            //panel.innerHTML = '<span></span><img style="position:absolute;display:block;margin-left:' + ancho + 'px;margin-top:' + alto + 'px;" src="' + waitimg + '">';
            $id("backgroundLayer").removeEventListener("click", hideQuickListPanel, true);
            hideQuickListPanel();
            log("url: " + url);
            log("añadir: " + !remove);
            var estado = document.body.style.cursor;
            document.body.style.cursor = 'wait';
            doPost(url, (!remove ? "atl" : "rfl") + "[]=" + list, function(result) {
                log("Datos enviados con exito");
                log("resultado: " + result.length);
                //hideQuickListPanel();
                if (inSection('Film')) {
                    updateListCount(remove ? -1 : 1);
                }
            });
            document.body.style.cursor = estado;
        }

        function extractFilmLists(emptydiv) {
            var xpath = "//input[@name='rfl[]']/@value";
            var iterator = findNodes(emptydiv, xpath);
            var nodo;
            var lists = [];
            while ((nodo = iterator.iterateNext()) != null) {
                lists.push(nodo.value);
            }
            return lists;
        }

        function readLists(id) {
            var url = "http://www.filmaffinity.com/es/edtmovielists.php?movie_id=" + id;
            doGet(url, function(response) {
                var emptydiv = document.createElement('div');
                emptydiv.innerHTML = response;
                var listas = extractFilmLists(emptydiv);
                for (ix in listas) {
                    var lista = listas[ix];
                    var nodo = $id(lista);
                    if (typeof nodo != "undefined") {
                        //nodo.style.backgroundColor = "#E0FFE0";
                        nodo.className = "delListItem";
                    }
                }
            });
        }

        function openQuickListPanel(e) {
            var listItemTemplate = '<td class="menu"><span class="listItem" id="{ID}" href="#">{NAME}</span></td>';
            var ancho = 320;
            var pelicula = this.id;
            //Obtenemos las listas desde la configuración
            var listas = getValues("list.");
            listas.sort(function(a, b) {
                return a - b;
            });
            // Por si queremos simular mas listas
            //for (n=1;n<63;n++) listas.push(listas[0]);
            log("Nº de listas:" + listas.length);
            var numItems = listas.length;
            var maxItemsPerColumn = Math.floor((document.body.clientHeight * 0.75) / 14);
            var numColumns = Math.ceil(numItems / maxItemsPerColumn);
            var numItemsPerColumn = Math.ceil(numItems / numColumns);
            var alto = (Math.min(numItems, numItemsPerColumn)) * 15;

            var id;
            if (numItems > 0) {
                GM_addStyle('#backgroundLayer { width: 100%; height: 100%; background-color: white; position: fixed; left: 0; right: 0; top: 0; bottom: 0; opacity: 0; }');
                GM_addStyle('#panel_listas { color: black; background-color: #FFF; text-align: center; border: 1px solid gray; width:auto; height: ' + alto + 'px; opacity: 1; position: absolute; left: 0; top: 0; overflow: auto; }');
                GM_addStyle("#panel_listas td.menu {border-top:1px solid #EEEEEE;background-color:#FFF;}");
                GM_addStyle("#panel_listas span.emptyItem {background-color: #FFF;}");
                GM_addStyle('td.menu span.listItem {cursor:pointer;padding:1px 10px 1px 5px; color: black; background-color: #FFF; font-size: 9px; font-family: Verdana,Arial,Helvetica,sans-serif; text-decoration: none; text-indent: 3px; cursor: hand; display: block}');
                GM_addStyle('td.menu span.listItem:hover {padding:1px 10px 1px 5px; color: #003366; background-color: #FFCC00; font-size: 9px; font-family: Verdana,Arial,Helvetica,sans-serif; text-decoration: none; text-indent: 3px;  cursor: hand; display: block }');
                GM_addStyle('td.menu span.delListItem {cursor:pointer;padding:1px 10px 1px 5px; color: black; background-color: #E0FFE0; font-size: 9px; font-family: Verdana,Arial,Helvetica,sans-serif; text-decoration: none; text-indent: 3px; cursor: hand; display: block}');
                GM_addStyle('td.menu span.delListItem:hover {padding:1px 10px 1px 5px; color: #003366; background-color: #FF6666; font-size: 9px; font-family: Verdana,Arial,Helvetica,sans-serif; text-decoration: none; text-indent: 3px;  cursor: hand; display: block }');
                var background = d.createElement('DIV');
                background.id = 'backgroundLayer';
                d.body.appendChild(background);

                var panel = d.createElement('DIV');
                panel.id = 'panel_listas';

                var html = '<table width="auto" cellspacing="0" cellpadding="0" border="0" bgcolor="#415570" class="rmenu">';
                html += '<tbody>';
                for (var row = 0; row < numItemsPerColumn; row++) {
                    html += '<tr>';
                    for (var col = 0; col < numColumns; col++) {
                        var i = (numItemsPerColumn * col) + row;
                        if (i < numItems) {
                            id = listas[i];
                            var name = GM_getValue('list.' + listas[i]);
                            html += listItemTemplate.replace(/{ID}/g, id).replace(/{NAME}/g, name);
                        } else {
                            html += '<td class="menu"><span class="emptyItem" style="background-color:#FFF;">&nbsp;</span></td>';
                        }
                    }
                    html += '</tr>';
                }

                html += '</tbody></table>';
                panel.innerHTML = html;
                var centro;
                var left = e.clientX;
                var top = e.clientY;
                if (left + (ancho * numColumns + 2) > document.body.clientWidth) {
                    centro = (document.body.clientWidth / 2) - ((ancho * numColumns + 2) / 2);
                    left = Math.max(document.body.clientWidth - (ancho * numColumns + 2) - 10, centro);
                }
                if ((top + alto) > document.body.clientHeight) {
                    centro = (document.body.clientHeight / 2) - (alto / 2);
                    top = Math.max(document.body.clientHeight - (alto + 20), centro);
                }
                panel.style.left = left + document.body.scrollLeft;
                panel.style.top = top + document.body.scrollTop;

                d.body.appendChild(panel);
                $id("backgroundLayer").addEventListener("click", hideQuickListPanel, true);
                for (i = 0; i < listas.length; i++) {
                    id = listas[i];
                    $id(id).addEventListener("click", function() {
                        log('Seleccionada lista: ' + this.id + " nombre: " + this.textContent);
                        doAddFilmToList(pelicula, this.id);
                    }, false);
                }
                if (getPreference('FETCHFILMLISTS', false)) readLists(pelicula);
            } else {
                alert("Visite primero la página MIS LISTAS");
            }
            return false;
        }

        function createButtonNode(pelicula) {
            var button = d.createElement('IMG');
            button.className = 'addToList';
            button.src = img_plus;
            button.alt = "Añadir pélicula a listas";
            button.id = pelicula;
            button.addEventListener("click", openQuickListPanel, false);
            return button;
        }

        // Añade el icono de añadir a listas rapidas en las listas de peliculas
        function addQuickList() {
            // Path para localizar todos los 'a&ntilde;adir a Lista';
            // xpath = "/html/body/table[2]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr/td/div/table/tbody/tr/td[2]/table/tbody/tr/td/a";
            GM_addStyle('.addToList {margin-left:5px;cursor:pointer;width:9px;height:9px;}');
            var anchors = getElementsByClassName(d, 'a', 'addl');
            for (var i = 0; i < anchors.length; i++) {
                var anchor = anchors[i];
                if (anchor.textContent.indexOf('a listas') >= 0) {
                    var pelicula = anchor.href.split('=')[1].split('&')[0];
                    anchor.parentNode.appendChild(createButtonNode(pelicula));
                }
            }
        }

        // Añade el enlace a listas rapidas en la ficha de la pelicula
        function addQuickListFilm() {
            GM_addStyle('.addToList {margin-left:5px;cursor:pointer;width:9px;height:9px;}');
            var pelicula = document.location.href.split('/film')[1].split('.')[0];
            var anchor = "//div/b[text()='LISTAS']".findNode();
            if (anchor != null) {
                anchor.parentNode.appendChild(createButtonNode(pelicula));
            }
            var anchor = '//b[text()="TITULO ORIGINAL"]/../following-sibling::*'.findNode();
            if (anchor != null) {
                anchor.appendChild(createButtonNode(pelicula));
            }
        }

        if (inSection('Film')) addQuickListFilm(); else addQuickList();
    }

    ;


    // Soporte para ordenar las peliculas en las listas con Drag & Drop
    function orderFilmsInList() {
        var ultimo,timerID;
        var working = false;

        function mark(node, color) {
            for (var n = 0; n < 4; n++) {
                node.cells[n].style.backgroundColor = color;
            }
        }

        function sendData() {
            var urlListOrder = "http://www.filmaffinity.com/es/listorder.php";
            var params = "neworder={NEWORDER}&list_id={ID}";
            // Obtener ID de la lista
            var id = url.split("=")[1];
            // Obtener todos los ID de las peliculas, en orden.
            var nodos = "//a[@class='posn']".findNodesArray();
            var neworder = "";
            for (ix in nodos) {
                neworder += "," + nodos[ix].id;
            }
            neworder = neworder.substr(1).replace(/ch/g, "");
            working = true;
            var estado = document.body.style.cursor;
            document.body.style.cursor = 'wait';

            doPost(urlListOrder, params.replace(/{NEWORDER}/g, neworder).replace(/{ID}/g, id), function() {
                var nodosTR = "//a[@class='posn']/parent::*/parent::*".findNodesArray();
                for (var ix in nodosTR) {
                    mark(nodosTR[ix], "#FFFFFF");
                }
                working = false;
                d.body.style.cursor = estado;
            });
        }

        ;

        function setEventUp(img) {
            img.addEventListener("click", function () {
                doFilmUp(this);
            }, false);
        }

        function setEventDown(img) {
            img.addEventListener("click", function () {
                doFilmDown(this);
            }, false);
        }


        // Cambiamos la posición
        function adjustRowData(node, pos) {
            node.cells[0].childNodes[1].textContent = pos;
            var imgUp = node.cells[0].childNodes[3];
            var imgDown = node.cells[0].childNodes[4];
            if (pos == 1) {
                imgUp.style.display = "none";
            } else {
                imgUp.style.display = "block";
                setEventUp(imgUp);
            }
            if (pos == ultimo) {
                imgDown.style.display = "none";
            } else {
                imgDown.style.display = "block";
                setEventDown(imgDown);
            }
            // Marcamos el panel,
            mark(node, "#FFEFEF");
        }

        ;


        function doFilmUp(e) {
            clearTimeout(timerID);
            var pos = "//a[@id='{ID}']/text()".replace(/{ID}/g, e.id).findNode().textContent;
            var nodo1 = e.parentNode.parentNode;
            var tabla = nodo1.parentNode;
            var nodo2 = tabla.rows[pos - 1];
            var clon1 = nodo1.cloneNode(true);
            var clon2 = nodo2.cloneNode(true);
            tabla.insertBefore(clon1, nodo2);
            tabla.insertBefore(clon2, nodo2);
            tabla.removeChild(nodo1);
            tabla.removeChild(nodo2);
            // intercambiar nodos pos y pos-1
            adjustRowData(clon1, pos - 1);
            adjustRowData(clon2, pos);
            timerID = setTimeout(sendData, 2000);
            // si pos = 2 o pos = ultimo => modificar flechas
        }

        function doFilmDown(e) {
            clearTimeout(timerID);
            var pos = parseInt("//a[@id='{ID}']/text()".replace(/{ID}/g, e.id).findNode().textContent);
            var nodo1 = e.parentNode.parentNode;
            var tabla = nodo1.parentNode;
            var nodo2 = tabla.rows[pos + 1];
            var clon1 = nodo1.cloneNode(true);
            var clon2 = nodo2.cloneNode(true);
            tabla.insertBefore(clon2, nodo2);
            tabla.insertBefore(clon1, nodo2);
            tabla.removeChild(nodo1);
            tabla.removeChild(nodo2);
            // intercambiar nodos pos y pos-1
            adjustRowData(clon1, pos + 1);
            adjustRowData(clon2, pos);
            timerID = setTimeout(sendData, 2000);
            // si pos = 2 o pos = ultimo => modificar flechas
        }

        function init() {
            GM_addStyle('.upimg {display:block;margin-top:5px;cursor:pointer;}');
            GM_addStyle('.downimg {display:block;margin-top:5px;cursor:pointer;}');
            var nodos = "//a[@class='posn']".findNodesArray();
            var arriba = "<img id='{ID}' title='Subir pelicula en lista' class='upimg' src='" + upimg + "'>";
            var arribah = "<img id='{ID}' title='Subir pelicula en lista' class='upimg' style='display:none' src='" + upimg + "'>";
            var abajo = "<img id='{ID}' title='Bajar pelicula en lista' class='downimg' src='" + downimg + "'>";
            var abajoh = "<img id='{ID}' title='Bajar pelicula en lista' class='downimg' style='display:none' src='" + downimg + "'>";
            ultimo = nodos.length;
            for (var ix in nodos) {
                nodos[ix].style.display = "block";
                var html = ((ix > 0) ? arriba : arribah) + ((ix < ultimo - 1) ? abajo : abajoh);
                html = html.replace(/{ID}/g, nodos[ix].id);
                nodos[ix].parentNode.innerHTML += html;
            }
            var imagenes = getElementsByClassName(d, 'img', 'upimg');
            for (ix in imagenes) {
                setEventUp(imagenes[ix]);
            }
            ;
            imagenes = getElementsByClassName(d, 'img', 'downimg');
            for (ix in imagenes) {
                setEventDown(imagenes[ix]);
            }
            ;
        }

        init();
    }

    // Soporte para plegar los menús
    function doMenus() {

        function injectNewMenus() {
            // Dirección base de los menus
            var baseXPath = '/html/body/table[2]/tbody/tr/td/table/tbody';
            var nodePath = '/tr/td/table/tbody/tr/td/i[text()="{ANCHOR}"]/ancestor::*[position()=6]';
            var menuTemplate = '<td><table width="150" cellspacing="0" cellpadding="0" border="0" bgcolor="#ffffff" class="menu"><tbody><tr><td class="menutitle"><i>{MENU_NAME}</i></td></tr>{OPTIONS}</tbody></table></td>';
            var optionTemplate = '<tr><td class="menu"><a id="{ID}" href="{HREF}" target="{TARGET}">{TITLE}</a></td></tr>';
            var container = findNode(d, baseXPath);
            for (var ix in menus)
            {
                var menu = menus[ix];
                if (getPreference(menu.cond, true)) {
                    var anchor = getPreference("menu." + menu['name'] + ".anchor", menu['anchor']);
                    var xpath = baseXPath + nodePath.replace("{ANCHOR}", anchor);
                    var nodoAnterior = findNode(d, xpath);
                    var optionsHTML = "";
                    for (ox in menu['options'])
                    {
                        var option = menu['options'][ox];
                        var text = optionTemplate.replace("{ID}", "IX" + ix + "OX" + ox);
                        text = text.replace("{HREF}", option['href']);
                        text = text.replace("{TARGET}", option['target']);
                        text = text.replace("{TITLE}", option['title']);
                        optionsHTML += text;
                    }
                    var html = menuTemplate.replace('{MENU_NAME}', menu['name']);
                    html = html.replace("{OPTIONS}", optionsHTML);
                    var fapp = d.createElement('tr');
                    fapp.innerHTML = html;
                    if (nodoAnterior != null) {
                        var position = getPreference("menu." + menu['name'] + ".position", menu['position']);
                        nodoAnterior = (position == ANCHOR_AFTER) ? nodoAnterior.nextSibling : nodoAnterior;
                        container.insertBefore(fapp, nodoAnterior);
                        for (var ox in menu['options'])
                        {
                            option = menu['options'][ox];
                            var id = "IX" + ix + "OX" + ox;
                            if (option['onclick'] != null) {
                                $id(id).addEventListener("click", option['onclick'], true);
                            }
                        }
                    }
                }
            }
        }

        // Muestra u oculta el menu que enviamos
        // recibe el nodo TD que contiene el titulo
        function doFold(menu, fold) {
            //alert(menu.textContent);
            var nodo = menu.parentNode.nextSibling;
            while (nodo != null) {
                if (nodo.nodeType != 3) {
                    if (fold) nodo.style.display = "none";
                    else nodo.style.display = "";
                }
                nodo = nodo.nextSibling;
            }
        }

        function onFold() {
            var nodo = this.parentNode.nextSibling;
            var folded = nodo.style.display == "none";
            doFold(this, !folded);
            setPreference("menuFolded." + this.textContent, !folded);
        }

        function injectFoldCode() {
            var menus = "//td[@class='menutitle']".findNodesArray();
            for (ix in menus) {
                var menu = menus[ix];
                menu.style.cursor = "pointer";
                menu.addEventListener("click", onFold, true);
                //alert(menu.textContent);
                doFold(menu, getPreference("menuFolded." + menu.textContent, false));
            }
        }

        injectNewMenus();
        if (getPreference('FOLDMENUS', false)) {
            injectFoldCode();
        }
    }

    ;

    // Añade enlaces a la pagina de busqueda
    function processSearch() {
        var stype = url.substr(url.lastIndexOf('=') + 1);
        var xpath = xpath = "//option[@value='" + stype + "']";
        var nodo = findNode(d, xpath);
        var elem = d.forms[0].elements[1];
        if (typeof nodo != "undefined") elem.selectedIndex = nodo.index;
        d.forms[0].elements[0].focus();
    }


    function doFixEnglishLink() {
        for (var i = 0; i < d.links.length; ++i)
            if (d.links[i].href == 'http://www.filmaffinity.com/en/main.html')
                d.links[i].href = url.replace('/es/', '/en/');
    }

    function hideTVShows(ancestor) {
        var nodos = ("//a[contains(text(),'(Serie de TV)')]/ancestor::*[position()=" + ancestor + "]").findNodesArray();
        for (ix in nodos) {
            nodos[ix].style.display = "none";
        }
    }

    function addCountryFlag(country) {
        var imgTemplate = '<img style="margin-left:5px;" border="0" align="middle" title="{NAME}" src="/imgs/countries/{CODE}.jpg"/>';
        var nodo = "//b[text()='PAÍS']/../../td/table/tbody/tr/td/img".findNode();
        if (nodo != null && typeof nodo != "undefined") {
            var code = getCountryCode(country);
            var html = nodo.parentNode.innerHTML;
            if (html.indexOf(code + ".jpg") == -1) {
                nodo.parentNode.innerHTML = html + imgTemplate.replace(/{NAME}/g, country).replace(/{CODE}/g, getCountryCode(country));
            }
        }
    }

    // Banderas de los paises coproductores.
    function coproductionFlags() {
        var productora = '//b[text()="PRODUCTORA"]/../following-sibling::*/text()'.findNode().textContent.toLowerCase();
        for (var ix in countriesCodes) {
            if (productora.indexOf(ix.toLowerCase()) > -1) {
                addCountryFlag(ix);
            }
        }
    }


    // Alinear el icono de zoom a la imagen, por si hemos centrado con el script o
    // via stylish
    function alignZoomIcon() {
        // Todo: Supongo que este classname sera temporal
        log("alineando icono de zoom");
        var icon = "//img[@class='prueba']".findNode();
        log("icono: " + icon);
        if (icon != null && typeof icon != "undefined") {
            var thumb = "//img[@class='prueba']/../a/img".findNode();
            icon.style.position = "relative";
            icon.style.left = "-" + (thumb.width / 2 - 7) + "px"; // Las miniaturas tienen 100 de ancho - mitad de icono
            icon.style.top = "15px"; // bajamos el icono para sobreponerlo a la miniatura
        }
        log("fin de alineado");
    }

    //******************************************
    var GM_setValue_SAFE = (GM_setValue.toString().search(/cookie/i) == -1);
    if (!GM_setValue_SAFE) return;
    var date = new Date();
    log('Inicio (' + date + ')');
    log(navigator.userAgent);
    log(appName + ' ' + appVersion);

    GM_registerMenuCommand('Configurar ' + appName + ' ' + appVersion + '...', preferences);
    GM_registerMenuCommand('Ver información de depurado', showLog);

    log("¿Admin? " + isAdmin);

    doMenus();

    if (url.search(/\/filter\.php/ig) > -1) {
        return;
    }

    if (getPreference('CENTERPAGE', false)) {
        GM_addStyle('.ot {margin-left:auto;margin-right:auto;');
    }
    ;

    if (inSection('MyFriends')) {
        doFriendsRatingChange();
        doAddFlagsToFriends();
    }

    // Pagina de pelicula, a&ntilde;adir enlaces
    if (inSection('Film')) {
        externalLinks();
        if (getPreference('SHOWQUICKLIST', true)) quickList();
        coproductionFlags();
    }

    // Cambios en Almas Gemelas
    if (inSection('SoulMates') && getPreference('SHOWSMCHANGES', true)) {
        soulMates();
    }


    // Pagina de Listas, capturar nombres
    if (inSection('MyLists')) {
        doCaptureLists();
    }

    // Paginas donde añadimos quickList
    if (inSections(['Tour','SoulMatesRec','UserRec','MyVotes','AutoTour','UserRatting','TopGen','Search'])
            && (getPreference('SHOWQUICKLIST', true))) {
        quickList();
    }

    if (getPreference('TESTDEBUG', false)) {
        if (inSections(['Tour','SoulMatesRec','UserRec','AutoTour','UserRatting','Search'])
                && getPreference('OMITTVSHOWS', false)) {
            hideTVShows(16);
        }

        if (inSections(['MyVotes','TopGen',])
                && getPreference('OMITTVSHOWS', false)) {
            hideTVShows(11);
        }
    }

    if (inSection("MyList")) {
        orderFilmsInList();
    }

    if (!inSection('MyData'))
        ratingStyle();

    // if (inSection('Stats'))
    //     doExtraStats(d.getElementsByTagName('table')[16]);

    if (inSection('Search')) {
        processSearch();
        externalLinks();
        ratingStyle();
    }

    if (inSection('MyData')) {
        doAddExtraStats(doAddContriesFlags());
    }

    if (inSections(['TopGen','AdvSearch','UptMyData'])) {
        doAddFlagsToOptionsSel();
    }

    if (inSection('MyFriends')) {
        doAddFlagsToFriends();
    }

    doAlt2Title();
    //doAddForumLink();
    if (getPreference('CHANGELIMIT', false)) {
        doAlterLimits();
    }
    doFixEnglishLink();
    //doRemoveAds();

    if (inSection('Film')) {
        alignZoomIcon();
    }

    log("Fin (" + date + ")");

    // Ordenar y mostrar los country codes
    //countriesCodes.sort();
    i = 0;
    for (name in countriesCodes) {
        codigo = countriesCodes[name];
        texto = '"' + name + '":"' + codigo + '",';
        log(texto);
    }
}
;


